S14-03 SSR-Nuxt3-项目:mr-ssr-nuxt3-ts-oppo
[TOC]

接口文档
首页信息
说明 : 调用此接口 , 获取首页商品信息
请求方法 : GET
接口地址 : /home/info
可选参数 :
type: 商品类型,支持: oppo 、onePlus、intelligent, 默认是oppo调用例子 : baseURL + /home/info?type=oppo
{
"code": 200,
"data": {
"navbars": [
],
"banners":[
],
"categorys":[
]
}
}商品详情
说明 : 调用此接口 , 获取商品详情信息
请求方法 : GET
接口地址 : /oppoDetail
可选参数 :
type: 类型:oppo 、air、watch、tablet, 默认是oppo调用例子 : baseURL + /oppoDetail?type=oppo
{
"code": 200,
"data": [
{
"id": 19978,
"title": "Enco X 系列",
"productDetailss": [
{
"categoryCode": "000020",
"id": 21452,
"title": "OPPO Enco X2 镜夜黑 有线充版",
"marketingText": "45dB 降噪深度",
"skuId": 8687,
"skuName": "OPPO Enco X2 镜夜黑 有线充版",
.....
}
]
}
]
}环境搭建
项目初始化
pnpm dlx nuxi init mr-ssr-nuxt3-oppo集成-样式@
依赖包:
- normalize.css
- 安装:
pnpm i normalize.css
- 安装:
- sass
- 安装:
pnpm i sass
- 安装:
配置: 全局引入 normalize.css

自定义全局样式:
global.scss
1、定义全局样式global.scss

2、添加配置,使全局有效

variables.scss
1、定义全局样式变量

2、设置配置,自动导入全局样式变量

3、在组件中使用变量、混合

代码片段


集成-ElementPlus2@
Element Plus 官网:https://element-plus.org/zh-CN/guide/quickstart.html
安装文档:https://nuxt.com.cn/modules/element-plus
依赖包:
- element-plus
- 安装:
pnpm i element-plus
- 安装:
- @element-plus/nuxt
- 安装:
pnpm i @element-plus/nuxt -D
- 安装:
步骤:
1、安装依赖包
2、在nuxt.config.ts中设置配置
export default defineNuxtConfig({
modules: [
'@element-plus/nuxt'
],
elementPlus: {
/** Options */
icon: 'ElIcon',
importStyle: 'scss',
themes: ['dark'],
}
})早期配置:组件中使用需要手动导入

3、在组件中使用element-plus组件,【是否是自动导入?】
<template>
<el-button @click="ElMessage('hello')">button</el-button>
<ElButton :icon="ElIconEditPen" type="success">button</ElButton>
<LazyElButton type="warning">lazy button</LazyElButton>
</template>Options:
【TODO】
SEO@

404处理@
在pages目录中创建[...slug].vue页面,匹配所有找不到页面的路由

网络请求封装@
import type { AsyncData, UseFetchOptions } from "nuxt/dist/app/composables";
const BASE_URL = "http://codercba.com:9060/oppo-nuxt/api/";
type Methods = "GET" | "POST";
export interface IResultData<T> {
code: number;
data: T;
}
class HYRequest {
request<T = any>(
url: string,
method: Methods,
data?: any,
options?: UseFetchOptions<T>
): Promise<AsyncData<T, Error>> {
return new Promise((resolve, reject) => {
const newOptions: UseFetchOptions<T> = {
baseURL: BASE_URL,
method: method,
...options,
};
if (method === "GET") {
newOptions.query = data;
}
if (method === "POST") {
newOptions.body = data;
}
useFetch<T>(url, newOptions as any)
.then((res) => {
resolve(res as AsyncData<T, Error>);
})
.catch((error) => {
reject(error);
});
});
}
get<T = any>(url: string, params?: any, options?: UseFetchOptions<T>) {
return this.request<T>(url, "GET", params, options);
}
post<T = any>(url: string, data?: any, options?: UseFetchOptions<T>) {
return this.request<T>(url, "POST", data, options);
}
}
export default new HYRequest();使用
import hyRequest from "./index";
import type { IResultData } from "./index";
import { IHomeState } from "@/store/home";
export type IHomeInfoType = "oppo" | "onePlus" | "intelligent"; // oppo 、onePlus、intelligent
export const getHomeInfo = (type: IHomeInfoType) => {
return hyRequest.get<IResultData<IHomeState>>("/home/info", {
type: type || "oppo",
});
};集成-Pinia
依赖包:
- pinia
- 安装:
pnmp i pinia,有冲突则添加--force
- 安装:
- @pinia/nuxt
- 安装:
pnmp i @pinia/nuxt
- 安装:
步骤:
1、安装依赖包
2、配置:nuxt.config.ts

Layout
接口
说明 : 调用此接口 , 获取首页商品信息
请求方法 : GET
接口地址 : /home/info
可选参数 :
type: 商品类型,支持: oppo 、onePlus、intelligent, 默认是oppo调用例子 : baseURL + /home/info?type=oppo
{
"code": 200,
"data": {
"navbars": [
],
"banners":[
],
"categorys":[
]
}
}
Layout
1、在项目的layout/default.vue中编写layout

2、创建components/app-header/index.vue组件
3、创建components/app-footer/index.vue组件

4、在app.vue中使用layout

组件:app-header

页面布局

功能
字体图标@
必须文件:
iconfont.cssiconfont.ttf
iconfont.css
1、修改字体文件路径

2、配置全局应用字体图标样式

3、在组件中使用字体图标

自定义布局@
1、在layout目录创建empty-layout.vue页面

2、在login/index.vue和register/index.vue中指定使用自定义的布局


3、效果

组件:app-footer

组件:navbar

页面布局
1、页面布局

2、在layout中使用组件

请求数据@
1、server:在server/home.ts中发送请求

2、store:在store/home.ts中发送异步请求

TS类型: 为请求的数据定义TS类型

3、组件:在~/layouts/default.vue中触发store中的action

功能
渲染数据
1、在~/layouts/default.vue中获取store中的数据,并传递给navbar组件

2、在navbar组件中接收数据,并渲染

切换标签
1、在navbar组件中添加点击事件

2、实现点击事件,切换标签

路由跳转-组件式
1、在navbar组件中为链接的to属性添加动态获取path的方法getPagePath(item)

2、实现getPagePath(item)方法,完成路由跳转

组件:search
页面布局
1、使用组件

2、在components/search/index.vue中创建组件

login【
页面布局
1、点击跳转到login页面

register【
home
页面布局
组件:swiper

页面布局
1、使用组件

2、接收props,并渲染

功能
指示器


组件:tab-category

页面布局
1、使用组件

2、接收数据,并渲染


功能
路由跳转-编程式
1、定义点击事件handleItemClick(),向外发射itemClick事件


2、在外部接收itemClick事件


组件:section-category

页面布局
1、使用组件

2、页面布局


组件:section-title

页面布局
1、使用组件

2、页面布局

组件:grid-view
页面布局
1、使用组件

2、页面布局

组件:grid-view-item
1、使用组件

2、页面布局


功能
第一个item
1、使用组件:传递参数category-url

2、页面布局:接收参数并渲染


3、控制第一个item是否显示

添加插槽

其他页
onePlus
注意
该页面结构和home页基本一致,很多组件都可以复用

intelligent

server【
详情页

接口
说明 : 调用此接口 , 获取商品详情信息
请求方法 : GET
接口地址 : /oppoDetail
可选参数 :
type: 类型:oppo 、air、watch、tablet, 默认是oppo调用例子 : baseURL + /oppoDetail?type=oppo
{
"code": 200,
"data": [
{
"id": 19978,
"title": "Enco X 系列",
"productDetailss": [
{
"categoryCode": "000020",
"id": 21452,
"title": "OPPO Enco X2 镜夜黑 有线充版",
"marketingText": "45dB 降噪深度",
"skuId": 8687,
"skuName": "OPPO Enco X2 镜夜黑 有线充版",
.....
}
]
}
]
}请求数据
1、server:在~/server/detail.ts中发送请求

2、组件:在~/oppo-details/index.ts中发送异步请求

页面布局
1、页面跳转:在index.vue中进行路由跳转

2、页面布局



打包部署
打包项目
1、执行pnpm run build命令打包项目,项目会打包到/.output/目录
注意: 打包nuxt项目时不能出现中文路径,主要因为Nitro不支持中文路径。
购买-阿里云服务器
阿里云服务器购买地址:https://aliyun.com/
1、打开控制台
2、菜单找到:云服务器 ECS
3、创建我们 ECS
4、服务器的配置
- CentOS 7.9 / 64
- 2cpu 4G
5、配置安全组
6、系统配置,自定义密码
7、确认订单,创建实例

连接-阿里云服务器
1、VS Code 安装:Remote SSH 插件

2、Remote SSH 连接远程服务器



安装 Node
见: 安装nodejs
安装n
见:安装n
安装pm2
见:安装pm2